package com.c2b.algorithm.leetcode.base;

/**
 * <a href='https://leetcode.cn/problems/check-if-one-string-swap-can-make-strings-equal/'>仅执行一次字符串交换能否使两个字符串相等(Check if One String Swap Can Make Strings Equal)</a>
 * <p>给你长度相等的两个字符串 s1 和 s2 。一次 字符串交换 操作的步骤如下：选出某个字符串中的两个下标（不必不同），并交换这两个下标所对应的字符。</p>
 * <p>如果对 其中一个字符串 执行 最多一次字符串交换 就可以使两个字符串相等，返回 true ；否则，返回 false 。</p>
 *
 * <p>
 * <b>示例：</b>
 * <pre>
 * 示例 1：
 *      输入：s1 = "bank", s2 = "kanb"
 *      输出：true
 *      解释：例如，交换 s2 中的第一个和最后一个字符可以得到 "bank"
 *
 * 示例 2：
 *      输入：s1 = "attack", s2 = "defend"
 *      输出：false
 *      解释：一次字符串交换无法使两个字符串相等
 *
 * 示例 3：
 *      输入：s1 = "kelb", s2 = "kelb"
 *      输出：true
 *      解释：两个字符串已经相等，所以不需要进行字符串交换
 *
 * 示例 4：
 *      输入：s1 = "abcd", s2 = "dcba"
 *      输出：false
 * </pre>
 * </p>
 * <p>
 * <b>提示：</b>
 * <ul>
 *     <li>1 <= s1.length, s2.length <= 100</li>
 *     <li>s1.length == s2.length</li>
 *     <li>s1 和 s2 仅由小写英文字母组成</li>
 * </ul>
 * </p>
 *
 * @author c2b
 * @since 2024/1/18 14:32
 */
public class LC1790CheckIfOneStringSwapCanMakeStringsEqual_S {
    static class Solution {
        public boolean areAlmostEqual(String s1, String s2) {
            // 用于记录差异字符的数量
            int[] cnt = new int[26];
            // 用于记录位置不同的字符个数
            int diiffIndex = 0;
            int length = s1.length();
            for (int i = 0; i < length; i++) {
                if (s1.charAt(i)!=s2.charAt(i)) {
                    ++diiffIndex;
                    ++cnt[s1.charAt(i)-'a'];
                    --cnt[s2.charAt(i)-'a'];
                }
            }
            for (int count : cnt) {
                if (count != 0) {
                    return false;
                }
            }
            return diiffIndex <= 2;
        }
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        System.out.println(solution.areAlmostEqual("bank", "kanb"));
        System.out.println(solution.areAlmostEqual("attack", "defend"));
        System.out.println(solution.areAlmostEqual("kelb", "kelb"));
        System.out.println(solution.areAlmostEqual("abcd", "dcba"));
    }
}
